#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>



//字符函数
#include <ctype.h>

//字符分类函数
//int main()
//{
//	//islower 判断参数部分的字符是否是小写字母，
//	// int islower(int c)
//	//通过返回值来说明是否是小写字母，如果是小写字母，就返回非0(是)的整数
//	//如果不是小写字母，就返回0。
//	int ret1 = 'a';
//	int ret2 = 'A';
//
//	printf("%d\n", islower(ret1));
//	printf("%d\n", islower(ret2));
//
//}

//其余的判断字符类型的函数使用方法大同小异

//int main()
//{
//	int ret = ' ';
//
//	printf("%d\n", isspace(ret));
//
//	return 0;
//}


//写一个代码，将字符串中的小写转成大写，其他字符不变

//ascii码
//a - 97 A - 65

//int main()
//{
//	char arr[] = "I am A Student";
//	int i = 0;
//
//	while (arr[i] != '\0')
//	{
//		if (islower(arr[i]))
//		{
//			arr[i] = arr[i] - 32;
//		}
//		i++;
//	}
//
//	printf("%s\n", arr);
//
//	return 0;
//}

//int main()
//{
//	char arr[] = "I am A Student";
//	char c = '0';
//	int i = 0;
//	
//	while (arr[i])
//	{
//		c = arr[i];
//		if (islower(c))
//		{
//			c = c - 32;
//		}
//		i++;
//		//printf("%c", c);
//		putchar(c);
//	}
//
//	
//	return 0;
//}

//字符转换函数
//1. int tolower(int c)//将参数传进去的大写转小写
//2. int toupper(int c)//将参数传进去的小写转大写

//int main()
//{
//	char a = 'c';
//    
//	printf("%c\n", toupper(a));
//	printf("%c\n", tolower(a));
//
//	return 0;
//}


//将字符串中的小写字母转大写，其他字符不变

//int main()
//{
//	char arr[] = "I am a STUdent";
//	int i = 0;
//
//	while (arr[i] != '\0')
//	{
//		if (islower(arr[i]))
//		{
//			arr[i] = toupper(arr[i]);
//		}
//		i++;
//	}
//	printf("%s\n", arr);
//
//	return 0;
//}

//模拟实现islower函数
//
//int my_islower(int src)
//{
//	if (src >= 'a' && src <= 'z')
//	{
//		return 1;
//	}
//	else
//		return 0;
//
//}
//
//int main()
//{
//	char a = 'a';
//
//	int ret = my_islower(a);
//	printf("%d\n", ret);
//
//	return 0;
//}



//字符串函数


//strlen函数
#include <string.h>

#include <assert.h>

//int main()
//{
//	  // size_t                size_t
//	  // 3                        7
//	if (strlen("abc") - strlen("abcdefg") > 0)
//	{
//		printf(">\n");
//	}
//	else
//		printf("<=\n");
//
//	return 0;
//}

//模拟实现strlen函数


//计数器
//size_t my_strlen(const char* p)
//{
//  assert(p);
//	int count = 0;
//	while (*p != '\0')
//	{
//		count++;
//		p++;
//	}
//	return count;
//
//}


//不创建临时变量
//size_t my_strlen(char* p)
//{
//	if (*p == '\0')
//		return 0;
//	else
//		return 1 + my_strlen(p + 1);
//	//该方法为递归
//}

//指针 - 指针
//size_t my_strlen(char* p)
//{
//	assery(p);
//
//	char* start = p;
//	
//	while (*p != '\0')
//	{
//		p++;
//	}
//
//	size_t ret = p - start;
//
//	return ret;
//
//}
//
//
//
//int main()
//{
//	char arr[] = "abcdefg";
//	size_t ret = my_strlen(arr);
//
//	printf("%zd\n", ret);
//	return 0;
//}



//strcpy
//
// 1.源字符串，必须以'\0'结束
// 2.会将源字符串中的'\0'拷贝到目标空间
// 3.目标空间必须足够大，以确保能存放源字符串
// 4.目标空间必须可修改
// 
// 
//int main()
//{
//	char arr1[] = "hello world";
//	char arr2[20] = "xxxxxxxxxxxx";
//
//	char* ret = strcpy(arr2, arr1);
//
//	printf("%s\n", arr2);
//	printf("%s\n", ret);
//
//	return 0;
//}

//模拟实现strcpy

//version 1.0
//char* my_strcpy(char* des, const char* src)
//{
//	assert(src != NULL);
//	assert(des != NULL);
//	char* ret = des;
//
//	//拷贝\0以前的内容
//	while (*src != '\0')
//	{
//		*des = *src;
//		des++;
//		src++;
//	}
//	
//	//拷贝\0
//	*des = *src;
//
//	return ret;
//}


//version 2.0
//char* my_strcpy(char* des, const char* src)
//{
//	assert(des != NULL);
//	assert(src != NULL);
//	char* ret = des;
//
//	while (*des++ = *src++)//拷贝字符直到\0无法进入循环
//	{
//		;//++是运算等级比*高，但是，++是后置是，是先使用des去解引用，然后++
//	}
//
//	return ret;
//}
//
//
//int main()
//{
//	char arr1[] = "hello world";
//	char arr2[20] = "xxxxxxxxxxxxxxxxx";
//	char* ret = my_strcpy(arr2, arr1);
//	
//	printf("%s\n", arr2);
//	printf("%s\n", ret);
//
//	return 0;
//}

//strcat函数
// 1.源字符串必须以'\0'结束
// 2.目标字符串也必须以'\0'结束
// 3.目标空间必须足够大，能够容下源字符串的内容
// 4.目标空间必须可修改

char* my_strcat(char* des, const char* src)
{
	assert(des && src);
	char* ret = des;
	//找到目标空间的\0
	while (*des != '\0')
	{
		des++;
	}
	//拷贝
	while (*des++ = *src++)
	{
		;
	}
	return ret;
}


int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "world";

	char* s = my_strcat(arr1, arr2);
	printf("%s\n", arr1);
	printf("%s\n", s);

	return 0;
}




